
#include "ThreadMutex.h"

using namespace std;

ThreadMutex* ThreadMutex::mutexSharedDemon=NULL;

//Creo el Mutex.
ThreadMutex::ThreadMutex()
{
	if (pthread_mutex_init(&m,NULL)!=0){
		perror("Error en la inicialización.");
		exit(1);
	}
}

ThreadMutex* ThreadMutex::mutexDemon()
{
	if (!mutexSharedDemon)
		mutexSharedDemon = new ThreadMutex();
	return mutexSharedDemon;
}

// P del mutex.
void ThreadMutex::P()
{
	if (pthread_mutex_lock(&m)!=0)
	{
		perror("Mutex no válido");
		exit(1);
	}
}


//V del mutex
void ThreadMutex::V()
{
	if (pthread_mutex_unlock(&m)!=0)
	{
		perror("Mutex no válido");
		exit(1);
	}
}


// Elimino el mutex.
void ThreadMutex::Eliminar()
{
	int res= pthread_mutex_destroy(&m);
	switch(res)
	{
		case EBUSY:
			V();//ANTES DE ELIMINAR EL SEMÁFORO DEBO LIBERARLO.
			if(pthread_mutex_destroy(&m)==EINVAL)
			{
				perror("Mutex no válido");
				exit(1);
			}
		break;
		case EINVAL:
			perror("Mutex no válido");
			exit(1);
		break;
	}
}
